package images

import (
	"bytes"
	"fmt"
	"github.com/duke-git/lancet/v2/convertor"
	"image"
	"image/jpeg"
	"image/png"
)

// PngToBytes 输出png图片编码成字节数组
func PngToBytes(img image.Image) (ret []byte,
	err error) {
	var buffer bytes.Buffer
	err = png.Encode(&buffer, img)
	if err != nil {
		return nil, err
	}
	ret = buffer.Bytes()
	buffer.Reset()
	return
}

// JpegToBytes 输出jpeg图片编码成字节数组
// img 图片
// quality 质量
// ret 返回值
func JpegToBytes(img image.Image,
	quality int) (ret []byte, err error) {
	var buffer bytes.Buffer
	err = jpeg.Encode(&buffer, img, &jpeg.Options{Quality: quality})
	if err != nil {
		return nil, err
	}
	ret = buffer.Bytes()
	buffer.Reset()
	return
}

// FormBytesToJpg 从字节数组中解析出图片
// b 字节数组
// img 图片
// err 错误
// 输入字节数组，输出图片
func FormBytesToJpg(b []byte) (img image.Image, err error) {
	var buffer bytes.Buffer
	buffer.Write(b)
	img, err = jpeg.Decode(&buffer)
	buffer.Reset()
	return
}

// FormBytesToPng 从字节数组中解析出图片
// b 字节数组
// img 图片
// err 错误
// 输入字节数组，输出图片
func FormBytesToPng(b []byte) (img image.Image, err error) {
	var buffer bytes.Buffer
	buffer.Write(b)
	img, err = png.Decode(&buffer)
	buffer.Reset()
	return
}

// FormBytesToImage 从字节数组中解析出图片
// b 字节数组
// img 图片
// err 错误
// 输入字节数组，输出图片
func FormBytesToImage(b []byte) (img image.Image, err error) {
	var buffer bytes.Buffer
	buffer.Write(b)
	img, _, err = image.Decode(&buffer)
	buffer.Reset()
	return
}

// PngToBase64 将图片转为base64
// img 图片
// base64Str base64字符串
// 输入图片，输出base64字符串
func PngToBase64(img image.Image) (base64Str string, err error) {
	imgBytes, err := PngToBytes(img)
	if err != nil {
		return "", err
	}
	return fmt.Sprintf("data:%s;base64,%s", "image/png", convertor.ToStdBase64(imgBytes)), nil
}

// JpgToBase64 将图片转为base64
// img 图片
// quality 质量
// base64Str base64字符串
func JpgToBase64(img image.Image, quality int) (base64Str string, err error) {
	imgBytes, err := JpegToBytes(img, quality)
	if err != nil {
		return "", err
	}
	return fmt.Sprintf("data:%s;base64,%s", "image/jpeg", convertor.ToStdBase64(imgBytes)), nil
}
